PHP 8.1-এ Properties এর Immutability এবং Value Protection
PHP 8.1-এ Properties এর Immutability এবং Value Protection এর ধারণাগুলি ক্লাস প্রপার্টি ম্যানেজমেন্টে নতুন দৃষ্টিভঙ্গি প্রদান করেছে। এই দুটি বৈশিষ্ট্য কোডের স্থিতিশীলতা এবং সুরক্ষাকে বাড়িয়ে দেয়, যেখানে অবজেক্টের প্রপার্টি একবার সেট হওয়ার পর পরিবর্তন করা যায় না (immutability) এবং প্রপার্টির মান সুরক্ষিত রাখা যায় (value protection)।
PHP 8.1-এ readonly properties এবং value protection সম্পর্কে বিস্তারিত জানানো হলো, যা কোডের সঠিকতা এবং নিরাপত্তা নিশ্চিত করে।
1. Immutability (Readonly Properties)
Immutability এর মানে হল যে একবার একটি প্রপার্টি সেট হয়ে গেলে, সেই প্রপার্টির মান আর পরিবর্তন করা যাবে না। PHP 8.1-এ readonly প্রপার্টি যোগ করা হয়েছে, যা একটি ক্লাসের প্রপার্টি একবার সেট করার পর তা আর পরিবর্তন করতে দেয় না। এটি ক্লাসের অবজেক্টের অবস্থা নিশ্চিত করে এবং কোডের জন্য একটি সুরক্ষিত পরিবেশ তৈরি করে।
Readonly Properties এর Syntax:
class User {
public readonly string $name;
public function __construct(string $name) {
$this->name = $name;
}
}
$user = new User("John Doe");
echo $user->name; // Output: John Doe
$user->name = "Jane Doe"; // Error: Cannot modify readonly propertyএখানে, $name প্রপার্টি readonly হিসেবে ডিক্লেয়ার করা হয়েছে, তাই একবার সেট হওয়ার পর এটি পরিবর্তন করা যাবে না। যদি আপনি $name পরিবর্তন করার চেষ্টা করেন, PHP একটি ত্রুটি (error) দেখাবে।
Readonly Properties এর সুবিধা:
- সুরক্ষা: একবার ইনিশিয়ালাইজ হওয়ার পর প্রপার্টির মান পরিবর্তন না হওয়ার মাধ্যমে কোডে বেশি সুরক্ষা নিশ্চিত করা যায়।
- ডেটার অবস্থা সুরক্ষিত রাখা: আপনার অবজেক্টের প্রপার্টি একবার সেট হয়ে গেলে, তা অন্য কোথাও পরিবর্তিত হবে না, যা অবজেক্টের স্থিতিশীলতা এবং সঠিকতা নিশ্চিত করে।
2. Value Protection (Encapsulation)
Value Protection হল একটি নকশা প্যাটার্ন, যেখানে অবজেক্টের প্রপার্টিগুলির মানকে সুরক্ষিত রাখতে encapsulation ব্যবহার করা হয়। এতে, ক্লাসের প্রপার্টি সরাসরি অ্যাক্সেসযোগ্য না হয়ে, সেটি শুধুমাত্র নির্দিষ্ট মেথডের মাধ্যমে অ্যাক্সেস বা পরিবর্তন করা যায়।
এটি PHP-তে ঐতিহ্যগতভাবে getter এবং setter মেথড ব্যবহার করে করা হয়। উদাহরণস্বরূপ:
Getter and Setter উদাহরণ:
class Product {
private string $name;
public function __construct(string $name) {
$this->name = $name;
}
public function getName(): string {
return $this->name;
}
public function setName(string $name): void {
if ($name === "invalid") {
throw new Exception("Invalid name");
}
$this->name = $name;
}
}
$product = new Product("Laptop");
echo $product->getName(); // Output: Laptop
$product->setName("Phone");
echo $product->getName(); // Output: Phone
$product->setName("invalid"); // Error: Invalid nameএখানে, name প্রপার্টি private হিসেবে ডিফাইন করা হয়েছে, এবং আমরা getter এবং setter মেথডের মাধ্যমে প্রপার্টির মান অ্যাক্সেস এবং সেট করছি। setName() মেথডে একটি কাস্টম ভ্যালিডেশন যুক্ত করা হয়েছে, যা নির্দিষ্ট মান (যেমন "invalid") থেকে রক্ষা করে।
Value Protection-এর সুবিধা:
- ডেটা ভ্যালিডেশন: প্রপার্টি সেট করার সময় আপনি validation বা sanitization করতে পারেন, যাতে অবাঞ্ছিত বা অস্বাভাবিক মান সেট না হয়।
- Encapsulation: প্রপার্টির মান সরাসরি পরিবর্তন না হওয়ার মাধ্যমে কোডের নিরাপত্তা এবং সঠিকতা বজায় থাকে।
- Flexibility: প্রপার্টির মান সেট বা গেট করার জন্য আপনি মেথড যোগ করতে পারেন, যার মাধ্যমে আপনি অতিরিক্ত কার্যকরী কাস্টমাইজেশন করতে পারেন।
PHP 8.1 এ Readonly Properties এবং Value Protection এর তুলনা
| বৈশিষ্ট্য | Readonly Properties | Value Protection (Encapsulation) |
|---|---|---|
| প্রপার্টি পরিবর্তন | একবার সেট হলে পরিবর্তন করা যায় না। | প্রপার্টির মান নির্দিষ্ট মেথডের মাধ্যমে পরিবর্তন করা যায়। |
| কোডে সুরক্ষা | প্রপার্টি সুরক্ষিত থাকে, কোনো পরিবর্তন করা যায় না। | getter/setter মেথডের মাধ্যমে মান পরিবর্তন এবং প্রপার্টি অ্যাক্সেস করা হয়। |
| ভ্যালিডেশন | কোডে ভ্যালিডেশন নেই, শুধুমাত্র ইনিশিয়াল মান সেট করা হয়। | setter মেথডে ভ্যালিডেশন বা স্যানিটাইজেশন করা যায়। |
| ইউজার কেস | একবার সেট করা হলে প্রপার্টি পরিবর্তন না করার জন্য উপযুক্ত। | প্রপার্টির মানের নিয়ন্ত্রণ এবং ফ্লেক্সিবিলিটি প্রদান করে। |
| মেমরি এবং পারফরম্যান্স | হালকা এবং কার্যকর, কোনো অতিরিক্ত মেথডের প্রয়োজন নেই। | অতিরিক্ত getter/setter মেথড ব্যবহারের প্রয়োজন। |
3. Immutability with Backed Enums (Example)
PHP 8.1-এ Enums এর সাথে immutability একত্রে ব্যবহার করা যায়, যেখানে readonly প্রপার্টি ব্যবহার করে Enum কেসের মান পরিবর্তন করা যাবে না।
enum Status: string {
case Pending = 'pending';
case Approved = 'approved';
case Rejected = 'rejected';
}
class Order {
public readonly Status $status;
public function __construct(Status $status) {
$this->status = $status;
}
}
$order = new Order(Status::Pending);
echo $order->status->value; // Output: pending
// $order->status = Status::Approved; // Error: Cannot modify readonly propertyএখানে, Status Enum এবং readonly প্রপার্টি ব্যবহার করা হয়েছে, যাতে status প্রপার্টির মান একবার সেট হওয়ার পর আর পরিবর্তন করা না যায়।
Conclusion
PHP 8.1-এ Immutability এবং Value Protection দুটি নতুন বৈশিষ্ট্য, যা প্রপার্টির মান সুরক্ষিত এবং অপরিবর্তনীয় রাখার জন্য ব্যবহৃত হয়। Readonly properties ক্লাসের প্রপার্টি একবার ইনিশিয়ালাইজ হওয়ার পর পরিবর্তন না করার সুবিধা দেয়, যা ডেটার সুরক্ষা নিশ্চিত করে। অন্যদিকে, Value Protection encapsulation-এর মাধ্যমে প্রপার্টির মানের নিয়ন্ত্রণ নিশ্চিত করে, যেখানে আপনি getter/setter মেথড ব্যবহার করে মান যাচাই এবং পরিবর্তন করতে পারেন। এই ফিচারগুলো কোডের সঠিকতা, নিরাপত্তা এবং রক্ষণাবেক্ষণ সহজ করে তোলে।
Read more